/**
 **************************************************************************************************************************
 * 
 **************************************************************************************************************************
 * @file RBEffectCompiler.h
 **************************************************************************************************************************/

#pragma once

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBEffectCompiler.h)
#endif


/**************************************************************************************************************************
 * Includes
 **************************************************************************************************************************/
#include "RBMain/RBCommon.h"
#include "RBMain/RBString.h"

/**************************************************************************************************************************
 * Forward declarations
 **************************************************************************************************************************/
class RBEffectFactory;
class RBEffect;
class RBEffectTechnique;
class RBEffectPass;
struct RBShaderVariable;
struct RBShader;

namespace FXParser { struct FXDesc; }

/**************************************************************************************************************************
 * Classes
 **************************************************************************************************************************/
class RBEffectCompiler
{
public:

                    RBEffectCompiler() {}
                   ~RBEffectCompiler();

    void            Compile (const RBString& strFilename);
    void            Reset   (bool bBeforeReset);
    
    RBEffect*       RetrieveEffect          (const RBString& strEffectName);

protected:

    bool            CreateEffect(const RBString& strFilename, RBEffect& kEffect);

    bool            ParseEffect(const RBString& strFilename, FXParser::FXDesc* fxDesc, RBString& strToCompile);

    virtual bool    CompileNative(const RBString& text, RBEffect& kEffect, const FXParser::FXDesc& fxDesc) = 0;
    virtual bool    PreprocessShaderFile(RBString* pShaderText, const RBString& strFilename) = 0;

protected:
    typedef stdext::hash_map<RBString, RBEffect*> RBEffectMap;
    RBEffectMap m_mEffects;

};